using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer.SqlServerProvider;
using RRHH.Competencias.Entities.AdminPermisos;

namespace RRHH.Competencias.DataAccessLayer
{
    public class SqlServerDALPermiso:IDALPermiso
    {

        public SqlServerDALPermiso () { }
        

        #region Miembros de IDALPermiso
        public List<Permiso> Buscar(Usuario usuario, Funcion funcion, bool soloActivos )
        {
            List<Permiso> permisos = new List<Permiso>();

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_PermisoFuncion_buscar");

            if (usuario != null && usuario.Id > 0) stored.AgregarParametro("@usuarioId", usuario.Id);
            if (funcion != null && funcion.Id > 0) stored.AgregarParametro("@funcionId", funcion.Id);            
            stored.AgregarParametro("@soloActivos", soloActivos);            

            DataTable tabla = stored.ExecuteDataTable();

            foreach (DataRow fila in tabla.Rows)
            {
                Permiso permiso = new Permiso();

                permiso.Usuario = new Usuario();
                permiso.Usuario.Id = Convert.ToInt64(fila["usuarioId"]);
                permiso.Funcion = new Funcion();
                permiso.Funcion.Id = Convert.ToInt64(fila["funcionId"]);
                permiso.FechaAlta = Convert.ToDateTime(fila["fechaAlta"]);
                permiso.UsuarioAlta = new Usuario();
                permiso.UsuarioAlta.Id = Convert.ToInt64(fila["usuarioAltaId"]);

                if (fila["fechaBaja"] != DBNull.Value) permiso.FechaBaja = Convert.ToDateTime(fila["fechaBaja"]);
                if (fila["usuarioBajaId"] != DBNull.Value)
                {
                    permiso.UsuarioBaja = new Usuario();
                    permiso.UsuarioBaja.Id = Convert.ToInt64(fila["usuarioBajaId"]);
                }

                permisos.Add(permiso);
            }

            return permisos;
        }

        public List<Permiso> CompletarSegunUsuario(Usuario usuario)
        {
            List<Permiso> permisos = new List<Permiso>();

            if (usuario == null || usuario.Id <= 0) throw new DALException("Debe indicar el usuario para obtener los permisos");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_Permiso_buscar");
            stored.AgregarParametro("@usuarioId", usuario.Id);
            stored.AgregarParametro("@soloActivos", false);

            DataTable tabla = stored.ExecuteDataTable();

            foreach (DataRow fila in tabla.Rows)
            {
                Permiso permiso = new Permiso();

                permiso.Funcion = new Funcion();
                permiso.Funcion.Id = Convert.ToInt64(fila["funcionId"]);
                permiso.FechaAlta = Convert.ToDateTime(fila["fechaAlta"]);
                permiso.UsuarioAlta = new Usuario();
                permiso.UsuarioAlta.Id = Convert.ToInt64(fila["usuarioAltaId"]);
                if (fila["fechaBaja"] != DBNull.Value) permiso.FechaBaja = Convert.ToDateTime(fila["fechaBaja"]);
                if (fila["usuarioBajaId"] != DBNull.Value)
                {
                    permiso.UsuarioBaja = new Usuario();
                    permiso.UsuarioBaja.Id = Convert.ToInt64(fila["usuarioBajaId"]);
                }

                permisos.Add(permiso);
            }

            return permisos;
        }

        public void Eliminar(Usuario usuario, Usuario usuarioBaja)
        {
            if (usuario == null || usuario.Id <= 0) throw new DALException("Debe indicar el usuario para eliminar los permisos");
            if (usuarioBaja == null || usuarioBaja.Id <= 0) throw new DALException("Debe indicar el usuario que eliminara los permisos");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_Permiso_borrarSegunUsuario");
            stored.AgregarParametro("@usuarioId", usuario.Id);
            stored.AgregarParametro("@usuarioBajaId", usuarioBaja.Id);

            stored.ExecuteNonQuery();
        }

        public void Eliminar(Funcion funcion, Usuario usuarioBaja)
        {
            if (funcion == null || funcion.Id <= 0) throw new DALException("Debe indicar la funcion para eliminar los permisos");
            if (usuarioBaja == null || usuarioBaja.Id <= 0) throw new DALException("Debe indicar el usuario que eliminara los permisos");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_Permiso_borrarSegunFuncion");
            stored.AgregarParametro("@funcionId", funcion.Id);
            stored.AgregarParametro("@usuarioBajaId", usuarioBaja.Id);

            stored.ExecuteNonQuery();
        }

        public void Activar(Permiso permiso)
        {
            if (permiso.Funcion == null || permiso.Funcion.Id <= 0) throw new DALException("Debe indicar la funcion");
            if (permiso.Usuario == null || permiso.Usuario.Id <= 0) throw new DALException("Debe indicar el usuario");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_Permiso_reactivar");
            stored.AgregarParametro("@funcionId", permiso.Funcion.Id);
            stored.AgregarParametro("@usuarioId", permiso.Usuario.Id);

            stored.ExecuteNonQuery();
        }

        #endregion

        #region Miembros de IDALABM<Permiso>

        public void Completar(Permiso itemCompletar)
        {
            throw new DALException("The method or operation is not implemented.");
        }

        public void Guardar(Permiso item)
        {
            if (item.Funcion == null || item.Funcion.Id <= 0) throw new DALException("Debe indicar la funcion");
            if (item.Usuario == null || item.Usuario.Id <= 0) throw new DALException("Debe indicar el usuario");
            if (item.UsuarioAlta == null || item.UsuarioAlta.Id <= 0) throw new DALException("Debe indicar el usuario que da el permiso");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_Permiso_insertar");
            stored.AgregarParametro("@funcionId", item.Funcion.Id);
            stored.AgregarParametro("@usuarioId", item.Usuario.Id);
            stored.AgregarParametro("@fechaAlta", item.FechaAlta);
            stored.AgregarParametro("@usuarioAltaId", item.UsuarioAlta.Id);

            stored.ExecuteNonQuery();
        }

        public void GuardarOActualizar(Permiso item)
        {
            throw new DALException("The method or operation is not implemented.");
        }

        public void Actualizar(Permiso item)
        {
            throw new DALException("The method or operation is not implemented.");
        }

        public void Borrar(Permiso item)
        {
            if (item.Funcion == null || item.Funcion.Id <= 0) throw new DALException("Debe indicar la funcion");
            if (item.Usuario == null || item.Usuario.Id <= 0) throw new DALException("Debe indicar el usuario");
            if (item.UsuarioBaja == null || item.UsuarioBaja.Id <= 0) throw new DALException("Debe indicar el usuario que dara de baja el permiso");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_AdminUsuarios_Permiso_borrar");
            stored.AgregarParametro("@funcionId", item.Funcion.Id);
            stored.AgregarParametro("@usuarioId", item.Usuario.Id);
            stored.AgregarParametro("@fechaBaja", item.FechaBaja);
            stored.AgregarParametro("@usuarioBajaId", item.UsuarioBaja.Id);

            stored.ExecuteNonQuery();
        }

        public List<Permiso> BuscarTodos(bool soloActivos)
        {
            throw new DALException("The method or operation is not implemented.");
        }

        #endregion

        #region Miembros de IDALABM<Permiso>


        public void Desactivar ( Permiso item )
        {
            throw new NotImplementedException();
        }

        public List<Permiso> BuscarTodos ()
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
